import * as Cesium from 'cesium';

/**
 * 投影工具类
 * 提供坐标系转换功能，包括笛卡尔坐标与WGS84坐标之间的转换。
 * 
 * @class ProjectionUtil
 * 
 * @example
 * // 使用投影工具
 * const projectionUtil = new ProjectionUtil();
 * const wgs84 = projectionUtil.xyzToWgs84(xyz);
 */
export class ProjectionUtil {
  /**
   * 构造函数
   * 
   * @constructor
   * @description 初始化投影工具类实例
   */
  constructor() {
    // 投影相关配置
  }

  /**
   * 将笛卡尔坐标转换为WGS84坐标
   * 
   * @param {Cesium.Cartesian3} cartesian - 笛卡尔坐标对象
   * @returns {Object} WGS84坐标对象
   * @property {number} lng - 经度（度）
   * @property {number} lat - 纬度（度）
   * @property {number} height - 高度（米）
   */
  xyzToWgs84(cartesian) {
    const cartographic = Cesium.Cartographic.fromCartesian(cartesian);
    return {
      lng: Cesium.Math.toDegrees(cartographic.longitude),
      lat: Cesium.Math.toDegrees(cartographic.latitude),
      height: cartographic.height,
    };
  }

  /**
   * 将WGS84坐标转换为笛卡尔坐标
   * 
   * @param {Object|Array} wgs84 - WGS84坐标对象或数组
   * @param {number} wgs84.lng - 经度（度）
   * @param {number} wgs84.lat - 纬度（度）
   * @param {number} [wgs84.height=0] - 高度（米），可选，默认为0
   * @returns {Cesium.Cartesian3} 笛卡尔坐标对象
   */
  wgs84ToXyz(wgs84) {
    let lng, lat, height;
    if (Array.isArray(wgs84)) {
      [lng, lat, height = 0] = wgs84;
    } else {
      ({ lng, lat, height = 0 } = wgs84);
    }
    return Cesium.Cartesian3.fromDegrees(lng, lat, height);
  }
}
export default ProjectionUtil;
